package javaSE;


//*************************数组：int[] array = {   }  中括号不能写数字******************************************
//***************************int[] array2 = new int[3];没有初始化，默认为0 java当中的数组也是一个对象***************
//***************************int[] array3 = new int[]{1,2,3,4}; 与上相同，只是初始化了一个对象********************

import java.util.Arrays;
import java.util.Scanner;

public class Demo4 {
    public static void main1(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6, 7};//array(存储的是变量的地址)是一个引用变量存放在栈中，整个大括号是一个对象存放在堆中，引用变量指向一个对象
        System.out.println(array.length);//****************************************一个引用只能指向一个对象，多个引用可以指向一个对象
        System.out.println(array[4]);
        array[3] = 85;
        System.out.println(array[3]);
    }

    //**********打印数组*********************
    public static void main2(String[] args) {
        int[] array1 = {1, 2, 3, 4, 5, 6, 7};
        for (int i = 0; i < array1.length; i++) {//for循环打印
            System.out.print(array1[i] + " ");
        }
        System.out.println();
        for (int x : array1) {        //foreach循环，增强for循环  与for循环相比是拿不到下标的
            System.out.print(x + " ");
        }
        System.out.println();
        String ret = Arrays.toString(array1);//借助java操作数组的工具类Arrays.toString()：将参数的数组以字符串的形式进行输出
        System.out.println(ret);
    }


    public static void func1(int[] array) {
        array = new int[]{11, 12, 13, 15, 48};
    }

    public static void func2(int[] array) {
        array[0] = 899;
    }

    public static void main3(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6};
        System.out.println(Arrays.toString(array));
        //func1(array);  //********************************调用func1时打印的结果都是[1,2,3,4,5,6]，虽然传到func1的是array的地址，
        //*************************************** 但是传过去后，形参只是改变了自己的指向而已(指向了{11.....48})，但还是输出原来的对象
        func2(array);
        System.out.println(Arrays.toString(array));
    }


    //**********************数组作为方法的返回值******************************
    public static int[] transform(int[] array) { //int[] 返回数组的类型
        int[] ret = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            ret[i] = 2 * array[i];
        }
        return ret;
    }

    public static void main4(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        int[] ret2 = transform(array);
        System.out.println("所得新数组为:");
        System.out.println(Arrays.toString(ret2));
    }


    //*********************把数组转换成字符串输出*********************************
    public static String myToString(int[] array) {
        String str = "[";
        for (int i = 0; i < array.length; i++) {
            str += array[i];
            if (i != array.length - 1) {
                str += ",";
            }
        }
        str += "]";
        return str;
    }

    public static void main5(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        myToString(array);
        System.out.println("所得新字符串为:");
        System.out.println(myToString(array));
    }


    //********************顺序查找*********************************************
    public static int Find(int[] array, int ToFind) {
        for (int i = 0; i < array.length; i++) {
            if (array[i] == ToFind) {
                return i;
            }
        }
        return -1;//**********没有-1下标，表示没有找到该元素************************
    }

    public static void main6(String[] args) {
        //int[] array = {1,2,3,4,5};
        System.out.println("请输入三个数组成一个数组：");//********输入一个有个数限制的数组****************
        Scanner in = new Scanner(System.in);
        int[] array = new int[3];
        for (int i = 0; i < array.length; i++) {
            array[i] = in.nextInt();
        }
        System.out.println("请输入你要查找的元素:");
        Scanner scanner = new Scanner(System.in);
        int ToFind = scanner.nextInt();
        System.out.println("所查找数的下标为:");
        System.out.println(Find(array, ToFind));
    }


    // JAVA语法专门用于二分查找
    public static void main7(String[] args) {
        int[] arr = {1, 2, 3, 4};
        System.out.println("所查找元素的下标为:");
        System.out.println(Arrays.binarySearch(arr, 3));
    }


    //***********冒泡排序*******************最优写法，要判断
    public static void bubbleSort(int[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            //boolean flg = false;
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    int tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                    //flg = true;
                }
            }//if (flg == false){ //可能有一趟没有交换就已经有序了，所有要判断
            //return;
        }
    }


    public static void main8(String[] args) {
        int[] array = {1, 5, 4, 9, 8};
        bubbleSort(array);
        System.out.println(Arrays.toString(array));
    }

    //*************JAVA语法用于冒泡排序**********************
    public static void main9(String[] args) {
        int[] array = {1, 5, 4, 9, 8};
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));
    }

    //数组拷贝Arrays.copyof()********
    public static void main10(String[] args) {//以下四种不做任何处理的话都可以说成浅拷贝（只拷贝了地址），深浅拷贝是根据代码人为控制的，看你拷贝啥
        //深拷贝的话还需要拷贝对象
        int[] array = {1, 2, 3, 4, 5};
        //int[] ret = Arrays.copyOf(array,4);//  有拷贝长度
        //System.out.println(Arrays.toString(ret));

        //int[] ret1 = Arrays.copyOfRange(array,1,3);//左闭右开 结果得到[2,3]
        //System.out.println(Arrays.toString(ret1));

        /*int[] copy =new int[array.length];
        System.arraycopy(array,copy,0,0,array.length);//把array拷贝到copy数组，后面是指定条件
        System.out.println(Arrays.toString(copy));*/

        int[] copy = array.clone();
        System.out.println(Arrays.toString(copy));//数组克隆
    }


    //******************java二维数组就是一个特殊的一维数组：定义与一维数组一样****************
    public static void main11(String[] args) {
        int[][] arr = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
        for (int row = 0; row < arr.length; row++) {
            for (int col = 0; col < arr[row].length; col++) {
                System.out.printf("%d\t", arr[row][col]);
            }
            System.out.println("");
        }
        System.out.println("=============");
        for (int[] ret : arr) {
            for (int x : ret) {
                System.out.printf(x + " ");
            }
            System.out.println();
        }
        System.out.println("===============");
        System.out.println(Arrays.deepToString(arr));//      deepToString
    }
}

